/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb.cliente;

import ejb.common.ClienteManagerLocal;
import ejb.common.NegozioManagerLocal;
import entity.Cliente;
import entity.Comune;
import entity.Negozio;
import entity.Provincia;
import facade.ComuneFacade;
import facade.ProvinciaFacade;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Valerio
 */
@Stateful
public class ClienteEJB implements ClienteEJBLocal {

    @EJB
    private CarrelloEJBLocal carrelloEJB;
    @EJB
    private ComuneFacade comuneFacade;
    @EJB
    private ProvinciaFacade provinciaFacade;
    @EJB
    private NegozioManagerLocal negozioManager;
    @EJB
    private ClienteManagerLocal clienteManager;
    @PersistenceContext(unitName = "E-Market-ejbPU")
    private EntityManager em;
    //variabili d'istanza
    private Long id;
    private String nome;
    private Long idNegozioScelto;
    private Long idProvincia;
    private Long idComune;

    @Override
    public void setComune(Comune c) {
        this.setIdComune(c.getId());
    }

    @Override
    public Comune getComune() {
        if (idComune != null) {
            return this.comuneFacade.find(idComune);
        }
        return null;
    }

    @Override
    public void setProvincia(Provincia p) {

        this.setIdProvincia(p.getId());
    }

    @Override
    public Provincia getProvincia() {
        if (idProvincia != null) {
            return this.provinciaFacade.find(idProvincia);
        }
        return null;

    }

    @Override
    public void setIdProvincia(Long idProvincia) {
        if (provinciaFacade.find(idProvincia) == null) {
            throw new IllegalArgumentException("La provincia selezionata non è presente nel database");
        }
        this.idProvincia = idProvincia;
        resetByProvincia();
    }

    @Override
    public void setIdComune(Long idComune) {
        if (idProvincia == null) {
            throw new IllegalStateException("Bisogna settare prima la provincia");
        }
        this.idComune = idComune;
        resetByComune();
    }

    @Override
    public Long getIdProvincia() {
        return idProvincia;
    }

    @Override
    public Long getIdComune() {
        return idComune;
    }

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public String getNome() {
        return nome;
    }

    @Override
    public void setNome(String Nome) {
        this.nome = Nome;
    }

    @Override
    public Long getIdNegozioScelto() {
        return idNegozioScelto;
    }

    @Override
    public void setIdNegozioScelto(Long idNegozioScelto) {
        if (idComune == null) {
            throw new IllegalStateException("Bisogna settare prima il comune");
        }
        if (idNegozioScelto != this.idNegozioScelto) {
            this.idNegozioScelto = idNegozioScelto;
            resetByNegozio();
        }
    }

    @Override
    public Negozio getNegozioScelto() {
        if (idNegozioScelto != null) {
            return this.negozioManager.cercaNegozio(this.idNegozioScelto);
        }
        return null;
    }

    @Override
    public Cliente getCliente() {
        if (id != null) {
            return this.clienteManager.cercaClientePerId(id);
        }
        return null;
    }

    @Override
    public CarrelloEJBLocal getCarrelloEJB() {
        return carrelloEJB;
    }

    @Override
    public void setNegozioScelto(Negozio negozio) {
        this.setIdNegozioScelto(negozio.getId());
    }

    @Override
    public boolean isLogged() {
        return this.id != null && this.nome != null;
    }

    /**
     * Un negozio è valido se fornisce almeno un prodotto e se ha settato le
     * spese di spedizione
     *
     * @return isValido
     */
    @Override
    public boolean controlloNegozioValido() {
        if (idNegozioScelto == null) {
            return false;
        }
        return negozioManager.negozioValido(idNegozioScelto);
    }

    private void resetByProvincia() {
        System.out.println("resetbyprovincia");
        if (idComune != null) {
            Query q = em.createNamedQuery("comune.comuneDiUnaProvincia");
            q.setParameter(1, idComune);
            q.setParameter(2, idProvincia);
            if (q.getResultList().isEmpty()) {
                idComune = null;
                if (idNegozioScelto != null) {
                    idNegozioScelto = null;
                    if (!carrelloEJB.isEmpty()) {
                        carrelloEJB.svuotaCarrello();
                    }
                }
            }
        }
    }

    private void resetByComune() {
        System.out.println("resetbycomune");
        if (idNegozioScelto != null) {
            System.out.println("sono nell'if");
            System.out.println("idnegozio:" + idNegozioScelto);
            System.out.println("idComune" + idComune);
            System.out.println("negozio valido:" + negozioManager.negozioValido(idNegozioScelto, idComune));
            if (negozioManager.negozioValido(idNegozioScelto, idComune)) {
            } else {
                System.out.println("Sono nell'else");
                System.out.println("svuota carrello");
                carrelloEJB.svuotaCarrello();
                idNegozioScelto = null;
            }
        }
    }

    private void resetByNegozio() {
        System.out.println("resetbynegozio");
        Query q = em.createNamedQuery("negozio.negozioDiUnComune");
        q.setParameter(1, idNegozioScelto);
        q.setParameter(2, idComune);
        if (q.getResultList().isEmpty()) {
            throw new IllegalArgumentException("Il negozio non è presente nel database");
        }
        if (!carrelloEJB.isEmpty()) {
            carrelloEJB.svuotaCarrello();
        }
    }

    @Override
    public List<entity.Ordine> getOrdiniCliente() {
        if(id==null){
            return null;
        }
        Query q=em.createNamedQuery("ordine.cercaPerCliente");
        q.setParameter(1, id);
        return q.getResultList();
    }
}
